package main

import (
	"fmt"
	"sync"
	"time"
)

var (
	x4  int64
	wg4 sync.WaitGroup
	//lock4	sync.Mutex
	rwlock4 sync.RWMutex
)

/*
读锁和写锁类似于java中的共享锁和排他锁
读锁和读锁不互斥
读锁和写锁互斥
写锁和写锁互斥
*/
func write() {
	// lock4.Lock()   // 加互斥锁
	rwlock4.Lock() // 加写锁
	x4 = x4 + 1
	time.Sleep(10 * time.Millisecond) // 假设读操作耗时10毫秒
	fmt.Println("完成了写")
	rwlock4.Unlock() // 解写锁
	// lock4.Unlock()                     // 解互斥锁
	wg4.Done()
}

func read() {
	// lock4.Lock()                  // 加互斥锁
	rwlock4.RLock()              // 加读锁
	time.Sleep(time.Millisecond) // 假设读操作耗时1毫秒
	fmt.Println("完成了读")
	rwlock4.RUnlock() // 解读锁
	// lock4.Unlock()                // 解互斥锁
	wg4.Done()
}

func main() {
	start := time.Now()
	for i := 0; i < 10; i++ {
		wg4.Add(1)
		go write()
	}

	for i := 0; i < 1000; i++ {
		wg4.Add(1)
		go read()
	}

	wg4.Wait()
	end := time.Now()
	fmt.Println(end.Sub(start))
}
